"""
难度：简单
输入一个矩阵，按照从外向里以顺时针的顺序依次打印出每一个数字。
示例 1：
输入：matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出：[1,2,3,6,9,8,7,4,5]
示例 2：
输入：matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
输出：[1,2,3,4,8,12,11,10,9,5,6,7]
"""
# [1, 2, 3, 4]
# [5, 6 ,7, 8]
# [9,10,11,12]
'''按照题意进行模拟。
可以实现定义一下上、下、左、右的边界，然后按照逆时针的顺序从边界上依次访问元素。
当访问完当前边界之后，要更新一下边界位置，缩小范围，方便下一轮进行访问。'''
from typing import List
class Solution:
    def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
        size_m = len(matrix)

        if size_m == 0:
            return []
        size_n = len(matrix[0])
        if size_n == 0:
            return []
        up, down, left, right = 0,size_m - 1, 0, size_n-1
        ans = []
        while True:
            for i in range(left, right+1):
                ans.append(matrix[up][i])
            up += 1
            if up >down:
                break
            for i in range(up, down+1):
                ans.append(matrix[i][right])
            right -= 1
            if right < left:
                break
            for i in range(right, left-1, -1):
                ans.append(matrix[down][i])
            down -= 1
            if down < up:
                break

            for i in range(down, up-1, -1):
                ans.append(matrix[i][left])
            left += 1
            if left > right:
                break
        return ans
